package com.yz.LinkList;

public class RingLinkedListDemo {
    public static void main(String[] args) {
        RingLinkedList ringLinkedList = new RingLinkedList();
        ringLinkedList.addBoy(5);
        ringLinkedList.showBoy();
        ringLinkedList.print(1,2,5);

    }
}

//创建单向环形链表
class RingLinkedList {
    //先构建这个第一个孩子
    private Boy first = new Boy(-1);

    //向这个环形链表添加元素
    //直接输入要添加孩子的总数
    public void addBoy(int nums) {
        //数据传进来要进行判断
        if (nums < 2) {
            System.out.println("你输入的数据有问题");
            return;
        }
        //定义一个辅助变量,先置为null
        Boy temp = null;
        for (int i = 1; i <= nums; i++) {
            //根据编号创建小孩节点
            Boy boy = new Boy(i);
            if (i == 1) {
                first = boy;
                //第一个节点下一个是自己
                first.setNext(first);
                //这样就形成了一个环
                temp = first;  //first是不能动的，所以就用辅助变量
            } else {
                temp.setNext(boy);
                boy.setNext(first);
                //把现在的新节点指向下一个节点，这就可以达到遍历的效果
                temp = boy;
            }
        }
    }


    //展示环形链表里面的数据
    public void showBoy() {
        //遍历之前先判断是否为空
        if (first == null) {
            System.out.println("该链表是空的");
            return;
        }
        //定义一个辅助变量,先置为null
        Boy temp = first;
        while (true) {
            System.out.printf("这是第%d个孩子\n", temp.getNo());
            if (temp.getNext() == first) {
                //遍历结束，
                return;
            }
            //在将这个辅助变量后移
            temp = temp.getNext();
        }
    }


    //将环形链表的数据输出

    /**
     * 需要传入三个参数
     *
     * @param start 第一个参数是开始输出的位置
     * @param count 第二个参数是数数几下
     * @param total 第三个参数是总共里面有多少数据
     */
    public void print(int start, int count, int total) {
        //先做一个数据的校验
        if (first == null || start < 1 || start > total) {
            System.out.println("输入的参数有问题！");
            return;
        }
        //创建该临时变量
        Boy temp = first;
        //然后定位temp的位置，应该在first的前一个位置
        //因为初始化就是first，所以让他变换位置
        while (true) {
            //这是就已经定位到temp的位置了
            if (temp.getNext() == first) {
                break;
            }
            //其他情况没找到就一直遍历
            temp = temp.getNext();
        }
        //先遍历确定开始位置
        for (int i = 0; i < start - 1; i++) {
            first = first.getNext();
            temp = temp.getNext();
        }
        while (true) {
            //说明该环形链表只剩下一个数据了
            if (temp == first) {
                break;
            }
            //接下来就是输出数据
            for (int i = 0; i < count - 1; i++) {
                first = first.getNext();
                temp = temp.getNext();
            }
            System.out.printf("输出的编号是%d \n", first.getNo());
            first = first.getNext();
            temp.setNext(first);
        }
        //这个循环结束就只有一个数据
        System.out.printf("最后输出的数据是%d \n", first.getNo());
    }

}


//创建小孩对象
class Boy {
    private int no;
    private Boy next;

    public Boy(int no) {
        this.no = no;
    }

    public int getNo() {
        return no;
    }

    public void setNo(int no) {
        this.no = no;
    }

    public Boy getNext() {
        return next;
    }

    public void setNext(Boy next) {
        this.next = next;
    }
}
